package com.eds.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    /* *
     * @Title: redisTemplate
     * @Author: vvSmile
     * @Date: 2025-03-27 16:53:03
     * @param redisConnectionFactory
     * @return RedisTemplate<Object>
     * @Description: TODO 配置自定义Redis的value和key的序列化器
     *     RedisTemplate 是 Spring Data Redis 提供的一个核心类，用于与 Redis 进行交互。
     * 它封装了 Redis 的操作，支持多种数据类型的存储和读取。默认情况下，RedisTemplate 使用
     * JdkSerializationRedisSerializer 进行序列化，这种方式会生成难以阅读的二进制数据。
     * 为了更方便地存储和读取数据，通常会自定义序列化器。
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //创建RedisTemplate对象
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //设置连接工厂（RedisConnectionFactory 通常由 Spring Boot 自动配置，例如通过 application.yml）
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置 Redis 中键（Key）的序列化器为 StringRedisSerializer。
        //StringRedisSerializer 将键序列化为字符串形式，便于阅读和调试。
        //例如如果键是 "user:1001"，则存储在 Redis 中也是 "user:1001"。
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置 Redis 中值（Value）的序列化器为GenericJackson2JsonRedisSerializer（json）
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        //Redis 支持 Hash 数据结构，类似 Map 的键值对。
        //设置 Hash Key 的序列化器为 StringRedisSerializer，便于存储和读取字符串形式的键。
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        //设置 Hash Value 的序列化器为 GenericJackson2JsonRedisSerializer，以便存储复杂的对象。
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}
